/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.dommages.services.impl;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Transformer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Service;

import fr.generali.accueilclient.commun.exception.AccueilClientBusinessException;
import fr.generali.accueilclient.dommages.factory.AbstractRecherchePortefeuilleContratSiteFactory;
import fr.generali.accueilclient.dommages.om.ICriteresRecherchePortefeuilleContratSite;
import fr.generali.accueilclient.dommages.om.impl.DTOPortefeuilleContratTosca;
import fr.generali.accueilclient.dommages.services.IRecherchePortefeuilleContratSiteService;
import fr.generali.souscriptiongestion.dommages.tosca.rechercherportefeuillescontratsite.services.IRechercherPortefeuillesContratSiteWebService;
import fr.generali.souscriptiongestion.dommages.tosca.rechercherportefeuillescontratsite.demande.DTODemande;
import fr.generali.souscriptiongestion.dommages.tosca.rechercherportefeuillescontratsite.services.RechercherPortefeuillesContratSiteException;
import fr.generali.souscriptiongestion.dommages.tosca.rechercherportefeuillescontratsite.pty.portefeuille.DTOPortefeuilleContrat;
import fr.generali.souscriptiongestion.dommages.tosca.rechercherportefeuillescontratsite.reponse.DTOReponse;

/**
 * @author Holmes Kelly
 */
@Service
public class RecherchePortefeuilleContratSiteService extends AbstractRecherchePortefeuilleContratSiteFactory implements
                IRecherchePortefeuilleContratSiteService {

    /**
     * LOGGER
     */
    private static final Logger LOGGER = LoggerFactory.getLogger(RecherchePortefeuilleContratSiteService.class);

    /**
     * 
     */
    @Autowired
    private IRechercherPortefeuillesContratSiteWebService rechercherPortefeuillesContratSiteWebService;

    /**
     * 
     */
    @Autowired
    @Qualifier("portefeuillesContratSiteConverter")
    private Converter<DTOPortefeuilleContrat, DTOPortefeuilleContratTosca> portefeuillesContratSiteConverter;

    /**
     * {@inheritDoc}
     */
    public List<DTOPortefeuilleContratTosca> rechercherPortefeuilleContratSite(
                    ICriteresRecherchePortefeuilleContratSite criteresRecherchePortefeuilleContratSite)
        throws AccueilClientBusinessException {

        List<DTOPortefeuilleContratTosca> result = null;

        DTODemande criteres = null;

        if (criteresRecherchePortefeuilleContratSite != null) {

            criteres = new DTODemande();

            try {

                copyProperties(criteresRecherchePortefeuilleContratSite, criteres);

                DTOReponse reponse =
                                rechercherPortefeuillesContratSiteWebService.rechercherPortefeuillesContrat(criteres);

                List<DTOPortefeuilleContrat> portefeuillesContrat =
                                reponse == null ? null : reponse.getPortefeuillesContrat();

                if (portefeuillesContrat != null && !portefeuillesContrat.isEmpty()) {

                    result = new ArrayList<DTOPortefeuilleContratTosca>();

                    CollectionUtils.collect(portefeuillesContrat, getTransformerPortefeuilleContratSite(), result);
                }

            } catch (RechercherPortefeuillesContratSiteException e) {

                LOGGER.debug(e.getMessage());

                throw new AccueilClientBusinessException(e.getMessage(), e);

            }
        }

        return result;
    }

    /**
     * @return transformer DTOPortefeuilleContrat
     */
    private Transformer getTransformerPortefeuilleContratSite() {

        Transformer transformer = new Transformer() {

            public Object transform(Object input) {

                DTOPortefeuilleContrat portefeuilleContrat = (DTOPortefeuilleContrat ) input;

                return portefeuillesContratSiteConverter.convert(portefeuilleContrat);
            }
        };

        return transformer;
    }
}
